--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Utilities/rnid.py HEAD (3535327f) Text, 30.41 KB
T8b949e#!/usr/bin/env python3
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787argparse
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os
Tff7b72import T7ee787base64
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnidTa5d6ff"
Te6edf3SIG_EXT Tff7b72= Ta5d6ff"Ta5d6ffrsgTa5d6ff"
Te6edf3ENCRYPT_EXT Tff7b72= Ta5d6ff"Ta5d6ffrfeTa5d6ff"
Te6edf3CHUNK_SIZE Tff7b72= T79c0ff16Tff7b72*T79c0ff1024Tff7b72*T79c0ff1024
Tff7b72def Td2a8ffspinTb4b4b4(Te6edf3untilTff7b72=Tff7b72NoneTb4b4b4, Te6edf3msgTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tffa657printTb4b4b4(Te6edf3msgTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72while Tb4b4b4(Te6edf3timeout Tff7b72== Tff7b72None Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72<Te6edf3timeoutTb4b4b4) Tff7b72and Tff7b72not Te6edf3untilTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3msgTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72None Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Identity & Encryption UtilityTa5d6ff"Tb4b4b4)
T8b949e# parser.add_argument("file", nargs="?", default=None, help="input file path", type=str)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-iTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--identityTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal Reticulum identity or destination hash, or path to Identity fileTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--generateTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffgenerate a new IdentityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--importTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffimport_strTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffidentity_dataTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffimport Reticulum identity in hex, base32 or base64 formatTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-xTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--exportTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffexport identity to hex, base32 or base64 formatTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-vTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--verboseTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffincrease verbosityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-qTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--quietTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdecrease verbosityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--announceTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffaspectsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffannounce a destination based on this IdentityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-HTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--hashTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffaspectsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow destination hashes for other aspects for this IdentityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-eTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--encryptTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffencrypt fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-dTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--decryptTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdecrypt fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--signTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsign fileTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-VTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--validateTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffvalidate signatureTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--readTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffinput file pathTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--writeTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffoutput file pathTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--forceTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffwrite output even if it overwrites existing filesTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-ITa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--stdinTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Te6edf3argparseTff7b72.Td2a8ffSUPPRESSTb4b4b4) T8b949e# "read input from STDIN instead of file"
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-OTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--stdoutTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Te6edf3argparseTff7b72.Td2a8ffSUPPRESSTb4b4b4) T8b949e# help="write output to STDOUT instead of file",
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-RTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--requestTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrequest unknown Identities from the networkTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffidentity request timeout before giving upTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-pTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--print-identityTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffprint identity info and exitTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-PTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--print-privateTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffallow displaying private keysTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-bTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--base64Ta5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse base64-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-BTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--base32Ta5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffUse base32-encoded input and outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnid Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Te6edf3ops Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Te6edf3t Tff7b72in Tb4b4b4[Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4, Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4, Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4, Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3tTb4b4b4:
Te6edf3ops Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3ops Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThis utility currently only supports one of the encrypt, decrypt, sign or verify operations per invocationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffread Tff7b72= Te6edf3argsTff7b72.Td2a8ffencrypt
Tff7b72if Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffread Tff7b72= Te6edf3argsTff7b72.Td2a8ffdecrypt
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffread Tff7b72= Te6edf3argsTff7b72.Td2a8ffsign
Te6edf3identity_str Tff7b72= Te6edf3argsTff7b72.Td2a8ffidentity
Tff7b72if Te6edf3argsTff7b72.Td2a8ffimport_strTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_strTb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3identity_bytes Tff7b72= Te6edf3base64Tff7b72.Td2a8ffb32decodeTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_strTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimport_strTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity data specified for import: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff41Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3identity_bytesTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not create Reticulum identity from specified data: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff42Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity importedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprvTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffprint_privateTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : HiddenTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3wp Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3wpTb4b4b4) Tff7b72or Te6edf3argsTff7b72.Td2a8ffforceTb4b4b4:
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3wpTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWrote imported identity to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3wpTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists, not overwritingTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff43Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError while writing imported identity to file: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff44Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffgenerate Tff7b72and Tff7b72not Te6edf3identity_strTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo identity provided, cannot continueTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3targetloglevel Tff7b72= T79c0ff4
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverbose
Te6edf3quietness Tff7b72= Te6edf3argsTff7b72.Td2a8ffquiet
Tff7b72if Te6edf3verbosity Tff7b72!= T79c0ff0 Tff7b72or Te6edf3quietness Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3targetloglevel Tff7b72= Te6edf3targetloglevelTff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
T8b949e# Start Reticulum
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffcompact_log_fmt Tff7b72= Tff7b72True
Tff7b72if Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tff7b72-T79c0ff1
Tff7b72if Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffforce Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists. Not overwriting.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff3Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffgenerateTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNew identity Tffd700{Te6edf3identityTffd700}Ta5d6ff written to Tffd700{Te6edf3argsTff7b72.Td2a8ffgenerateTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while saving the generated Identity.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff4Tb4b4b4)
Te6edf3identity Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2 Tff7b72and Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_strTb4b4b4)Tb4b4b4:
T8b949e# Try recalling Identity from hex-encoded hash
Tff7b72tryTb4b4b4:
Te6edf3ident_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identity_strTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3ident_hashTb4b4b4) Tff7b72or Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3ident_hashTb4b4b4, Te6edf3from_identity_hashTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffrequestTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not recall Identity for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3ident_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can query the network for unknown Identities with the -R option.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff5Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3ident_hashTb4b4b4)
Tff7b72def Td2a8ffspincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3ident_hashTb4b4b4) Tff7b72!= Tff7b72None
Te6edf3spinTb4b4b4(Te6edf3spincheckTb4b4b4, Ta5d6ff"Ta5d6ffRequesting unknown Identity for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3ident_hashTb4b4b4)Tb4b4b4, Te6edf3argsTff7b72.Td2a8fftTb4b4b4)
Tff7b72if Tff7b72not Te6edf3spincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity request timed outTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff6Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3ident_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived Identity Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3ident_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from the networkTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ident_str Tff7b72= Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3hash_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3ident_hashTb4b4b4)
Tff7b72if Te6edf3ident_str Tff7b72== Te6edf3hash_strTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRecalled Identity Tffd700{Te6edf3ident_strTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRecalled Identity Tffd700{Te6edf3ident_strTffd700}Ta5d6ff for destination Tffd700{Te6edf3hash_strTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid hexadecimal hash providedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff7Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Try loading Identity from file
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_strTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpecified Identity file not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff8Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_strTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Identity Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identity_strTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode Identity from specified fileTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff9Tb4b4b4)
Tff7b72if Te6edf3identity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3aspects Tff7b72= Te6edf3argsTff7b72.Td2a8ffhashTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination aspects specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff32Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_name Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3aspects Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72if Te6edf3identityTff7b72.Td2a8ffpub Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff destination for this Identity is Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe full destination specifier is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149KeyErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo public key knownTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while attempting to send the announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffannounceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3aspects Tff7b72= Te6edf3argsTff7b72.Td2a8ffannounceTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination aspects specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff32Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_name Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3aspects Tff7b72= Te6edf3aspectsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprv Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated destination Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAnnouncing destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.1Tb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffannounceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff destination for this Identity is Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe full destination specifier is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCannot announce this destination, since the private key is not heldTa5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff33Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while attempting to send the announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffprint_identityTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPublic Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprvTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffprint_privateTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrivate Key : HiddenTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffexportTb4b4b4:
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprvTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffbase64Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffExported Identity : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3argsTff7b72.Td2a8ffbase32Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffExported Identity : Ta5d6ff"Tff7b72+Te6edf3base64Tff7b72.Td2a8ffb32encodeTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffExported Identity : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIdentity doesnTa5d6ff'Ta5d6fft hold a private key, cannot exportTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff50Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffread Tff7b72and Te6edf3argsTff7b72.Td2a8ffvalidateTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3SIG_EXTTb4b4b4)Tb4b4b4:
Te6edf3argsTff7b72.Td2a8ffread Tff7b72= Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3SIG_EXTTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSignature file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff not foundTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff10Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInput file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff not foundTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff11Tb4b4b4)
Te6edf3data_input Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInput file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff not foundTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff12Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data_input Tff7b72= Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not open input file for readingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff13Tb4b4b4)
T8b949e# TODO: Actually expand this to a good solution
T8b949e# probably need to create a wrapper that takes
T8b949e# into account not closing stdin when done
T8b949e# elif args.stdin:
T8b949e# data_input = sys.stdin
Te6edf3data_output Tff7b72= Tff7b72None
Tff7b72if Te6edf3argsTff7b72.Td2a8ffencrypt Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdout Tff7b72and Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72= Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3ENCRYPT_EXT
Tff7b72if Te6edf3argsTff7b72.Td2a8ffdecrypt Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdout Tff7b72and Te6edf3argsTff7b72.Td2a8ffread Tff7b72and Te6edf3argsTff7b72.Td2a8ffreadTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3ENCRYPT_EXTTb4b4b4)Tb4b4b4:
Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72= Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3ENCRYPT_EXTTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsign Tff7b72and Te6edf3identityTff7b72.Td2a8ffprv Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpecified Identity does not hold a private key. Cannot sign.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff14Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsign Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdout Tff7b72and Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Te6edf3argsTff7b72.Td2a8ffwrite Tff7b72= Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Te6edf3SIG_EXT
Tff7b72if Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffforce Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffOutput file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff already exists. Not overwriting.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff15Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3data_output Tff7b72= Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not open output file for writingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff15Tb4b4b4)
T8b949e# TODO: Actually expand this to a good solution
T8b949e# probably need to create a wrapper that takes
T8b949e# into account not closing stdout when done
T8b949e# elif args.stdout:
T8b949e# data_output = sys.stdout
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsignTb4b4b4:
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprv Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpecified Identity does not hold a private key. Cannot sign.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff16Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3data_inputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSigning requested, but no input data specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff17Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3data_outputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSigning requested, but no output specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff18Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSigning Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3data_inputTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff signed with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while encrypting data.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Te6edf3exitTb4b4b4(T79c0ff19Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4:
Tff7b72if Tff7b72not Te6edf3data_inputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSignature verification requested, but no input data specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff20Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# if not args.stdout:
T8b949e# RNS.log("Verifying "+str(args.validate)+" for "+str(args.read))
Tff7b72tryTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3sig_input Tff7b72= Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while opening Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff21Tb4b4b4)
Te6edf3validated Tff7b72= Te6edf3identityTff7b72.Td2a8ffvalidateTb4b4b4(Te6edf3sig_inputTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3data_inputTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3sig_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3validatedTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSignature Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is invalidTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff22Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSignature Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffvalidateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff made by Identity Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is validTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while validating signature.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Te6edf3exitTb4b4b4(T79c0ff23Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffencryptTb4b4b4:
Tff7b72if Tff7b72not Te6edf3data_inputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEncryption requested, but no input data specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff24Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3data_outputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEncryption requested, but no output specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff25Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEncrypting Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3more_data Tff7b72= Tff7b72True
Tff7b72while Te6edf3more_dataTb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3data_inputTff7b72.Td2a8ffreadTb4b4b4(Te6edf3CHUNK_SIZETb4b4b4)
Tff7b72if Te6edf3chunkTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3identityTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3more_data Tff7b72= Tff7b72False
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff encrypted for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while encrypting data.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Te6edf3exitTb4b4b4(T79c0ff26Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffdecryptTb4b4b4:
Tff7b72if Te6edf3identityTff7b72.Td2a8ffprv Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSpecified Identity does not hold a private key. Cannot decrypt.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff27Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3data_inputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDecryption requested, but no input data specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff28Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3data_outputTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDecryption requested, but no output specifiedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff29Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDecrypting Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff...Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3more_data Tff7b72= Tff7b72True
Tff7b72while Te6edf3more_dataTb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3data_inputTff7b72.Td2a8ffreadTb4b4b4(Te6edf3CHUNK_SIZETb4b4b4)
Tff7b72if Te6edf3chunkTb4b4b4:
Te6edf3plaintext Tff7b72= Te6edf3identityTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3chunkTb4b4b4)
Tff7b72if Te6edf3plaintext Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffData could not be decrypted with the specified IdentityTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff30Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3plaintextTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3more_data Tff7b72= Tff7b72False
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFile Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffreadTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff decrypted with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3argsTff7b72.Td2a8ffwriteTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffstdoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while decrypting data.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data_outputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Te6edf3data_inputTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72exceptTb4b4b4:
Tff7b72pass
Te6edf3exitTb4b4b4(T79c0ff31Tb4b4b4)
Tff7b72if Tff7b72TrueTb4b4b4:
Tff7b72pass
Tff7b72elif Tff7b72FalseTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff255Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────